package cn.rokhdelar.ams.common.domain.query;

import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.metadata.OrderItem;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;

@Data
@Schema(description = "分页查询实体")
public class PageQuery {
    @Schema(description = "页码")
    private Integer current = 1;
    @Schema(description = "大小")
    private Integer size = 100;
    @Schema(description = "排序字段")
    private String sortBy;
    @Schema(description = "是否升序")
    private Boolean isAsc = true;

    /**
     * 把PageQuery对象转换为MP的Page对象，便于直接调用
     * @param items 排序OrderItm，可变参数
     * @return 返回Page对象
     * @param <T> 实体对象
     */
    public <T> Page<T> toPage(OrderItem ... items) {
        //  构造分页条件
        Page<T> page = Page.of(current, size);

        //  构建排序条件，如果提供了orderItem数组，就直接使用该数组中的排序信息
        if (items != null && items.length > 0) {
            page.addOrder(items);
        } else if (StrUtil.isNotBlank(sortBy)) {
            page.addOrder(OrderItem.asc(sortBy).setAsc(isAsc));
        }

        return page;
    }

    /**
     * 把PageQuery对象转换为MP的Page对象，使用传入的排序字段和升降序
     * @param defaultSortBy 排序字段
     * @param defaultAsc 升降序
     * @return 返回Page对象
     * @param <T> 实体对象
     */
    public <T> Page<T> toPage(String defaultSortBy, Boolean defaultAsc) {
        return toPage(new OrderItem().setColumn(defaultSortBy).setAsc(defaultAsc));
    }

    /**
     * 默认使用创建时间作为排序字段降序排列
     * @return Page对象
     * @param <T> 实体对象
     */
    public <T> Page<T> toPageDefaultSortByCreateTime() {
        return toPage(new OrderItem().setColumn("create_time").setAsc(false));
    }

    /**
     * 默认使用排序字段作为排序字段降序排列，用于需要排序的场景，如菜单、权限等
     * @return Page对象
     * @param <T> 实体对象
     */
    public <T> Page<T> toPageDefaultSortBySort() {
        return toPage(new OrderItem().setColumn("sort").setAsc(false));
    }

    /**
     * 默认使用更新时间作为排序字段降序排列
     * @return Page对象
     * @param <T> 实体对象
     */
    public <T> Page<T> toPageDefaultSortByUpdateTime() {
        return toPage(new OrderItem().setColumn("update_time").setAsc(false));
    }

    /**
     * 默认使用名称作为排序字段升序排列，用于需要排序的场景，如用户、角色等
     * @return Page对象
     * @param <T> 实体对象
     */
    public <T> Page<T> toPageDefaultByName() {
        return toPage(new OrderItem().setColumn("name").setAsc(true));
    }

}
